package tp.pr5.mv.instructions.mem;

import tp.pr5.mv.Instruction;
import tp.pr5.mv.Memory;
import tp.pr5.mv.Opcode;
import tp.pr5.mv.OperandStack;
import tp.pr5.mv.ProgramCounter;
import tp.pr5.mv.inout.InMethod;
import tp.pr5.mv.inout.OutMethod;
import tp.pr5.mv.instructions.OneParamInstructions;
import tp.pr5.mv.traps.IncorrectDirEx;
import tp.pr5.mv.traps.MVTrap;

public class LOAD extends OneParamInstructions {
	
	
	public LOAD() { // Constructor por defecto de LOAD
		n = 0;
		op = Opcode.LOAD;
	}
	
	public LOAD(int par) { // Constructor con un parámetro de LOAD
		n = par; // Asignamos al atributo protegido n el valor de par
		op = Opcode.LOAD;
	}
	
	public void execute ( OperandStack stack, Memory mem, ProgramCounter pc, InMethod inMethod, OutMethod outMethod ) throws MVTrap {
		
		if ( !mem.canRead(n) )    // Si no podemos leer la posición es que es incorrecta (negativa).
			throw new IncorrectDirEx ( this, n );
		
		
		int a = mem.read(n); // Leemos el valor de esta posición y lo depositamos en la pila
		stack.push(a);

	
	}

	
	public Instruction create(int par) { // Devolvemos una instrucción load con un determinado parámetro
		
		return new LOAD(par);
		
	}
	

}
